package CAS.AtomicReferenceDemo;

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceDemo {
    static AtomicReference<Integer> atomicReference = new AtomicReference<>();

    public static void main(String[] args) {
        atomicReference.set(19);

        // 三个线程来充值，可能一个线程已经充值一次，另一个线程仅凭借“money值”前后没变
        //      (实际是变了两次，又变回来)，导致又冲了一次
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                while (true) {
                    while (true) {// 一个线程判断一次，操作完后break退出这个while，然后又因为外层的while，所以线程还会继续运行（判断）
                        Integer money = atomicReference.get();
                        if (money < 20) {
                            // money可能已经变了两次，这里以为没有变，另一个线程继续充值20元
                            if (atomicReference.compareAndSet(money, money + 20)) {
                                System.out.println("金额小于20，充值了20元,余额： " + atomicReference.get());
                                break;
                            } else {
                                System.out.println("进到这个方法，一定至少冲了两次");
                            }
                        } else {
                            System.out.println("金额大于20，不需要充值");
                        }
                    }
                }
            }).start();
        }//for

        new Thread(() -> {
            while (true) {  // 让100个消费动作，一直消费
                Integer money = atomicReference.get();
                if (atomicReference.compareAndSet(money, money - 10)) {
                    System.out.println("消费10元，余额： " + atomicReference.get());
                } else {
                    System.out.println("金额不够20元，不能消费");
                }
            }
        }).start();

    }//main线程
}
